Le but de ce document est de comparer différents paramètres et différentes méthodes de normalisation pour voir leur impact sur les analyses à postériori. Nous allons comparer 2 méthodes de normalisation :
NormalizeData de Seurat avec différentes
valeurs de paramètresSCTransform du package sctransformPour que la comparaison soit pertinente, tous les autres paramètres seront identiques (résolution des clusters, nombre de dimensions, seuil pour l’analyse de gènes DE, etc…)
La normalisation sert à enlever le biais expérimental (capture d’ADNc, amplification PCR, …) entre les cellules qui provoquent des différences de couverture entre les librairies.
# Loading data
seu <- Read10X("data/filtered_feature_bc_matrix/")
data <- CreateSeuratObject(seu)
Paramètres par défaut de la fonction
NormalizeDatade seurat. Les comptages de chaque gène et de chaque cellule sont divisés par le nombre total de comptage de gène dans cette cellule puis ce résultat est multiplié par le scale factor (10 000 par défaut) et mis au log.
default <- DimPlot(data_LN, reduction = "tsne")
default
On utilise la transformation du Centered Log Ratio sur les gènes. Cela signifie qu’on transforme chaque élément d’un vecteur de gène (de dimension nCells) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.
clrf <- DimPlot(data_CLR, reduction = "tsne")
clrf
On utilise la transformation du Centered Log Ratio sur les cellules. Cela signifie qu’on transforme chaque élément d’un vecteur de cellule (de dimension nGenes) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.
clrc <- DimPlot(data_CLRc, reduction = "tsne")
clrc
Les comptages de gènes pour chaque cellule sont divisés par la somme des comptages et multipliés par un scale.factor (ici 1e6 pour avoir des count per millions). Les données ne sont pas mises au log.
rc <- DimPlot(data_RC, reduction = "tsne")
rc
SCTransform se base sur l’observation qu’il semble y avoir une relation linéaire entre le nombre d’UMI et le nombre de gènes détectés dans une cellule. Cette méthode fit un modèle linéaire généralisé avec les UMI en variable à expliquer et la profondeur de séquençage comme variable explicative
sct <- DimPlot(data_SC, reduction = "tsne")
sct
On utilise la même fonction que dans l’onglet SCTransform mais on lui spécifie un autre modèle (GLM Gamma Poisson). C’est supposé réduire le temps de calcul
sctglm <- DimPlot(data_SCGLM, reduction = "tsne")
sctglm
Paramètres par défaut de la fonction
NormalizeDatade seurat. Les comptages de chaque gène et de chaque cellule sont divisés par le nombre total de comptage de gène dans cette cellule puis ce résultat est multiplié par le scale factor (10 000 par défaut) et mis au log.
default <- DimPlot(data_LN, reduction = "umap")
default
On utilise la transformation du Centered Log Ratio sur les gènes. Cela signifie qu’on transforme chaque élément d’un vecteur de gène (de dimension nCells) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.
clrf <- DimPlot(data_CLR, reduction = "umap")
clrf
On utilise la transformation du Centered Log Ratio sur les cellules. Cela signifie qu’on transforme chaque élément d’un vecteur de cellule (de dimension nGenes) en se basant sur le logarithme du ratio entre la valeur de cet élément et la moyenne géométrique du vecteur.
clrc <- DimPlot(data_CLRc, reduction = "umap")
clrc
Les comptages de gènes pour chaque cellule sont divisés par la somme des comptages et multipliés par un scale.factor (ici 1e6 pour avoir des count per millions). Les données ne sont pas mises au log.
rc <- DimPlot(data_RC, reduction = "umap")
rc
SCTransform se base sur l’observation qu’il semble y avoir une relation linéaire entre le nombre d’UMI et le nombre de gènes détectés dans une cellule. Cette méthode fit un modèle linéaire généralisé avec les UMI en variable à expliquer et la profondeur de séquençage comme variable explicative
sct <- DimPlot(data_SC, reduction = "umap")
sct
On utilise la même fonction que dans l’onglet SCTransform mais on lui spécifie un autre modèle (GLM Gamma Poisson). C’est supposé réduire le temps de calcul
sctglm <- DimPlot(data_SCGLM, reduction = "umap")
sctglm
Pour réduire le temps de calcul, on ne s’interessera qu’aux gènes up-régulés et avec un LogFC > 0.5
upset(df, sets = c("ln", "clrf", "clrc", "rc", "sct", "sctglm"), sets.bar.color = "#56B4E9",
order.by = "freq")
La normalisation avec les relative counts ne log-normalise pas contrairement à toutes les autres. C’est donc normal qu’on trouve un set de gènes spécifique de cette normalisation. On peut essayer de relancer l’analyse en prenant le log des counts ou on peut ignorer cette méthode également.
upset(df, sets = c("ln", "clrf", "clrc", "sct", "sctglm"), sets.bar.color = "#56B4E9",
order.by = "freq")
(A rajouter)
On peut voir que dans la globalité, la normalisation n’a à priori pas énormément d’impact sur les analyses à postériori
sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
##
## locale:
## [1] fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] UpSetR_1.4.0 glmGamPoi_1.8.0 sctransform_0.3.5 viridis_0.6.2
## [5] viridisLite_0.4.1 cowplot_1.1.1 forcats_0.5.2 stringr_1.4.1
## [9] dplyr_1.0.10 purrr_0.3.5 readr_2.1.3 tidyr_1.2.1
## [13] tibble_3.1.8 ggplot2_3.3.6 tidyverse_1.3.2 sp_1.5-0
## [17] SeuratObject_4.1.2 Seurat_4.2.0
##
## loaded via a namespace (and not attached):
## [1] readxl_1.4.1 backports_1.4.1
## [3] plyr_1.8.7 igraph_1.3.5
## [5] lazyeval_0.2.2 splines_4.2.1
## [7] listenv_0.8.0 scattermore_0.8
## [9] GenomeInfoDb_1.32.4 digest_0.6.30
## [11] htmltools_0.5.3 fansi_1.0.3
## [13] magrittr_2.0.3 tensor_1.5
## [15] googlesheets4_1.0.1 cluster_2.1.4
## [17] ROCR_1.0-11 tzdb_0.3.0
## [19] globals_0.16.1 modelr_0.1.9
## [21] matrixStats_0.62.0 spatstat.sparse_3.0-0
## [23] colorspace_2.0-3 rvest_1.0.3
## [25] ggrepel_0.9.1 haven_2.5.1
## [27] xfun_0.34 RCurl_1.98-1.9
## [29] crayon_1.5.2 jsonlite_1.8.3
## [31] progressr_0.11.0 spatstat.data_3.0-0
## [33] survival_3.4-0 zoo_1.8-11
## [35] glue_1.6.2 polyclip_1.10-4
## [37] gtable_0.3.1 gargle_1.2.1
## [39] zlibbioc_1.42.0 XVector_0.36.0
## [41] leiden_0.4.3 DelayedArray_0.22.0
## [43] future.apply_1.9.1 BiocGenerics_0.42.0
## [45] abind_1.4-5 scales_1.2.1
## [47] DBI_1.1.3 spatstat.random_2.2-0
## [49] miniUI_0.1.1.1 Rcpp_1.0.9
## [51] xtable_1.8-4 reticulate_1.26
## [53] spatstat.core_2.4-4 stats4_4.2.1
## [55] htmlwidgets_1.5.4 httr_1.4.4
## [57] RColorBrewer_1.1-3 ellipsis_0.3.2
## [59] ica_1.0-3 farver_2.1.1
## [61] pkgconfig_2.0.3 sass_0.4.2
## [63] uwot_0.1.14 dbplyr_2.2.1
## [65] deldir_1.0-6 utf8_1.2.2
## [67] labeling_0.4.2 tidyselect_1.2.0
## [69] rlang_1.0.6 reshape2_1.4.4
## [71] later_1.3.0 munsell_0.5.0
## [73] cellranger_1.1.0 tools_4.2.1
## [75] cachem_1.0.6 cli_3.4.1
## [77] generics_0.1.3 broom_1.0.1
## [79] ggridges_0.5.4 evaluate_0.17
## [81] fastmap_1.1.0 yaml_2.3.6
## [83] goftest_1.2-3 knitr_1.40
## [85] fs_1.5.2 fitdistrplus_1.1-8
## [87] RANN_2.6.1 sparseMatrixStats_1.8.0
## [89] pbapply_1.5-0 future_1.28.0
## [91] nlme_3.1-160 mime_0.12
## [93] xml2_1.3.3 compiler_4.2.1
## [95] rstudioapi_0.14 plotly_4.10.0
## [97] png_0.1-7 spatstat.utils_3.0-1
## [99] reprex_2.0.2 bslib_0.4.0
## [101] stringi_1.7.8 highr_0.9
## [103] rgeos_0.5-9 lattice_0.20-45
## [105] Matrix_1.5-1 vctrs_0.5.0
## [107] pillar_1.8.1 lifecycle_1.0.3
## [109] spatstat.geom_3.0-3 lmtest_0.9-40
## [111] jquerylib_0.1.4 RcppAnnoy_0.0.20
## [113] bitops_1.0-7 data.table_1.14.4
## [115] irlba_2.3.5.1 GenomicRanges_1.48.0
## [117] httpuv_1.6.6 patchwork_1.1.2
## [119] R6_2.5.1 promises_1.2.0.1
## [121] KernSmooth_2.23-20 gridExtra_2.3
## [123] IRanges_2.30.1 parallelly_1.32.1
## [125] codetools_0.2-18 MASS_7.3-58.1
## [127] assertthat_0.2.1 SummarizedExperiment_1.26.1
## [129] withr_2.5.0 GenomeInfoDbData_1.2.8
## [131] S4Vectors_0.34.0 mgcv_1.8-41
## [133] parallel_4.2.1 hms_1.1.2
## [135] grid_4.2.1 rpart_4.1.19
## [137] DelayedMatrixStats_1.18.2 rmarkdown_2.17
## [139] MatrixGenerics_1.8.1 googledrive_2.0.0
## [141] Rtsne_0.16 Biobase_2.56.0
## [143] shiny_1.7.3 lubridate_1.8.0